/*
  活动选择
  题目描述
    学校在最近几天有 n 个活动，这些活动都需要使用学校的大礼堂，在同一时间，礼堂只能被一个活动使用。
    由于有些活动时间上有冲突，学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。
    现在给出 n 个活动使用礼堂的起始时间 begini 和结束时间 endi (begini ＜ endi)，
    请你帮助办公室人员安排一些活动来使用礼堂，要求安排的活动尽量多。
  输入
    第一行一个整数 n (n ≤ 1000)；
    接下来的 n 行，每行两个整数，第一个 begini，第二个是 endi (begini ＜ endi ≤ 32767)。
  输出
    输出最多能安排的活动个数。
  样例输入
    11
    3 5
    1 4
    12 14
    8 12
    0 6
    8 11
    6 10
    5 7
    3 8
    5 9
    2 13
  样例输出
    4
*/

#include <bits/stdc++.h>
using namespace std;

struct str {
    int start; // 活动的开始时间
    int end;   // 活动的结束时间
} a[1005] = {};

// 定义排序规则函数，排序规则如下:
// 1) 按活动的结束时间的值从小到大的顺序进行排序;
// 2) 如果 2 个活动的结束时间相同, 则按照这 2 个活动的开始时间从小到大的顺序进行个排序
bool cmp(str a, str b) {
    if (a.end != b.end) {
        return a.end < b.end;
    } else {
        return a.start < b.start;
    }
}

int main() {
    int n;

    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i].start >> a[i].end;
    }

    // 对 a[1] ~ a[n] 按自定义排序规则函数 cmp() 进行排序
    sort(a + 1, a + n + 1, cmp);

    // 处理方式
    // 1) 首先选择排序后的第一个有效活动, 即选择 a[1]
    // 2) 后续遍历 a[2] ~ a[n]，选择"结束时间最早"并且"开始时间 >= 上一轮的结束时间"的活动
    int begin = 0;  // 上一个活动的下标
    int num = 0;
    for (int i = 1; i <= n; i++) {
        if (a[i].start >= a[begin].end) {
            begin = i;
            num++;
        }
    }
    cout << num;

    return 0;
}